/**
 * 
 */

package com.gustozzi.distribucion.action;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.interceptor.ServletRequestAware;

import com.gustozzi.distribucion.action.util.Constantes;
import com.gustozzi.distribucion.negocio.DistribucionBO;
import com.gustozzi.distribucion.negocio.impl.DistribucionBOImpl;
import com.gustozzi.domain.Pedido;
import com.gustozzi.domain.Producto;
import com.opensymphony.xwork2.ActionSupport;

/**
 * @author FABRIZIO
 * 
 */
public class PedidoAction extends ActionSupport implements ServletRequestAware
{

    private static final long serialVersionUID = 1L;
    DistribucionBO distribucionBO = new DistribucionBOImpl();
    private String botonSeleccionado;
    private Pedido pedidoBusqueda;
    private HttpServletRequest request;
    private List<Pedido> listaPedidos;
    private ArrayList<String> listaSeleccionados;
    private List<Producto> listaTotalizados;
    private boolean indicadorPedido;
    private String codigoSeleccionado;

    public String execute()
    {
        String destino = Constantes.CADENA_VACIA;
        try
        {
            if (botonSeleccionado.equalsIgnoreCase(Constantes.BTN_FILTRAR))
            {
                destino = obtenerListaPedidos();
            }
            else if (botonSeleccionado.equalsIgnoreCase(Constantes.BTN_ACEPTAR))
            {
                destino = asignarPedidos();
            }
        }
        catch (Exception e)
        {
            destino = Constantes.ERROR;
        }
        return destino;
    }

    public String obtenerListaPedidos()
    {
        String destino = "";
        List<Pedido> lista = null;
        try
        {
            String codigo = pedidoBusqueda.getCodigo();
            String codigoCliente = pedidoBusqueda.getCliente().getCodigo();
            String fechaDesde = pedidoBusqueda.getFechaDesde();
            String fechaHasta = pedidoBusqueda.getFechaHasta();

            lista = new ArrayList<Pedido>();
            lista = distribucionBO.obtenerListaPedido(codigo, codigoCliente, fechaDesde, fechaHasta);
            this.setListaPedidos(lista);
            request.getSession().setAttribute("listaPedidosCompletaSession", lista);
            destino = Constantes.CONSULTARPEDIDO;
        }
        catch (Exception e)
        {
            destino = "ERROR";
        }
        return destino;
    }

    @SuppressWarnings("unchecked")
    public String asignarPedidos()
    {
        String destino = Constantes.CADENA_VACIA;
        String destinoSession = Constantes.CADENA_VACIA;
        List<Pedido> listaPedidosSeleccionados = null;
        boolean indicadorCoincidencia = false;
        try
        {
            if (listaSeleccionados != null)
            {
                List<String> lista = listaSeleccionados;
                List<Pedido> listaPedidoSession = (ArrayList<Pedido>) request.getSession().getAttribute(
                        "listaPedidosCompletaSession");
                listaPedidosSeleccionados = new ArrayList<Pedido>();
                for (int i = 0; i < listaPedidoSession.size(); i++)
                {
                    Pedido pedido = listaPedidoSession.get(i);
                    for (int j = 0; j < lista.size(); j++)
                    {
                        if (pedido.getCodigo().equalsIgnoreCase(lista.get(j)))
                        {
                            listaPedidosSeleccionados.add(pedido);
                        }
                    }
                }
                if (request.getSession().getAttribute("listaPedidosSession") != null)
                {
                    List<Pedido> listaPrevia = (ArrayList<Pedido>) request.getSession().getAttribute(
                            "listaPedidosSession");
                    for (int k = 0; k < listaPrevia.size(); k++)
                    {
                        Pedido pedidoPrevio = listaPrevia.get(k);
                        indicadorCoincidencia = false;
                        for (int m = 0; m < listaPedidosSeleccionados.size(); m++)
                        {
                            Pedido pedidoNuevo = listaPedidosSeleccionados.get(m);
                            if (pedidoPrevio.getCodigo().equalsIgnoreCase(pedidoNuevo.getCodigo()))
                            {
                                indicadorCoincidencia = true;
                            }
                        }
                        if (!indicadorCoincidencia)
                        {
                            listaPedidosSeleccionados.add(listaPrevia.get(k));
                        }
                    }
                }

                setListaPedidos(listaPedidosSeleccionados);
                calcularTotalizados(listaPedidosSeleccionados);
                request.getSession().removeAttribute("listaPedidosCompletaSession");
                request.getSession().removeAttribute("listaPedidosSession");
                request.getSession().setAttribute("listaPedidosSession", listaPedidosSeleccionados);
            }
            destinoSession = request.getSession().getAttribute("ORIGENPEDIDO").toString();
            if (destinoSession.equalsIgnoreCase("DESPACHO"))
            {
                indicadorPedido = true;
                destino = Constantes.PEDIDOASIGNADODESPACHO;
            }
            else if (destinoSession.equalsIgnoreCase("DEVOLUCION"))
            {
                indicadorPedido = true;
                destino = Constantes.PEDIDOASIGNADODEVOLUCION;
            }
            else
            {
                indicadorPedido = true;
                Pedido beanPedido = (Pedido) listaPedidos.get(0);
                codigoSeleccionado = beanPedido.getCodigo();
                destino = Constantes.PEDIDOASIGNADORESERVA;
            }
        }
        catch (Exception e)
        {
            destino = Constantes.ERROR;
        }
        return destino;
    }

    public void calcularTotalizados(List<Pedido> listaPedidosSeleccionados)
    {
        List<Producto> listaTotalizadosArmada = null;
        List<Producto> listaProductosTotales = new ArrayList<Producto>();

        for (int n = 0; n < listaPedidosSeleccionados.size(); n++)
        {
            Pedido pedidoTotalizados = listaPedidosSeleccionados.get(n);
            List<Producto> listaProductosTotalizados = (ArrayList<Producto>) pedidoTotalizados.getListaProductos();
            listaProductosTotales.addAll(listaProductosTotalizados);
        }

        HashMap<String, List<Producto>> tablaProductos = new HashMap<String, List<Producto>>();
        List<Producto> listaProductosIguales = new ArrayList<Producto>();
        for (int p = 0; p < listaProductosTotales.size(); p++)
        {
            Producto prod = listaProductosTotales.get(p);
            if (p == 0)
            {
                listaProductosIguales.add(prod);
                tablaProductos.put(prod.getCodigo(), listaProductosIguales);
            }
            else
            {
                if (tablaProductos.containsKey(prod.getCodigo()))
                {
                    List<Producto> listaRetorno = (ArrayList<Producto>) tablaProductos.get(prod.getCodigo());
                    listaRetorno.add(prod);
                    tablaProductos.remove(prod.getCodigo());
                    tablaProductos.put(prod.getCodigo(), listaRetorno);
                }
                else
                {
                    listaProductosIguales = new ArrayList<Producto>();
                    listaProductosIguales.add(prod);
                    tablaProductos.put(prod.getCodigo(), listaProductosIguales);
                }
            }
        }

        Iterator<Entry<String, List<Producto>>> itr = tablaProductos.entrySet().iterator();
        listaTotalizadosArmada = new ArrayList<Producto>();
        while (itr.hasNext())
        {
            Entry<String, List<Producto>> list = itr.next();
            List<Producto> listaTotalProductos = (ArrayList<Producto>) list.getValue();
            Producto productoTotalizado = new Producto();
            int cantidadTotal = 0;
            double pesoTotal = 0;
            String nombre = "";
            for (int x = 0; x < listaTotalProductos.size(); x++)
            {
                Producto producto = (Producto) listaTotalProductos.get(x);
                cantidadTotal += producto.getCantidad();
                pesoTotal += producto.getPeso();
                nombre = producto.getDescripcion();
            }
            productoTotalizado.setCodigo(list.getKey());
            productoTotalizado.setCantidad(cantidadTotal);
            productoTotalizado.setPeso(pesoTotal * cantidadTotal);
            productoTotalizado.setNombre(nombre);
            productoTotalizado.setDescripcion(nombre);
            listaTotalizadosArmada.add(productoTotalizado);
            setListaTotalizados(listaTotalizadosArmada);
        }
        request.getSession().setAttribute("listaTotalizadosSession", listaTotalizadosArmada);
    }

    /**
     * @param botonSeleccionado
     *            the botonSeleccionado to set
     */
    public void setBotonSeleccionado(String botonSeleccionado)
    {
        this.botonSeleccionado = botonSeleccionado;
    }

    /**
     * @return the pedidoBusqueda
     */
    public Pedido getPedidoBusqueda()
    {
        return pedidoBusqueda;
    }

    /**
     * @param pedidoBusqueda
     *            the pedidoBusqueda to set
     */
    public void setPedidoBusqueda(Pedido pedidoBusqueda)
    {
        this.pedidoBusqueda = pedidoBusqueda;
    }

    /**
     * @return the listaPedidos
     */
    public List<Pedido> getListaPedidos()
    {
        return listaPedidos;
    }

    /**
     * @param listaPedidos
     *            the listaPedidos to set
     */
    public void setListaPedidos(List<Pedido> listaPedidos)
    {
        this.listaPedidos = listaPedidos;
    }

    @Override
    public void setServletRequest(HttpServletRequest request)
    {
        this.request = request;

    }

    /**
     * @return the listaSeleccionados
     */
    public ArrayList<String> getListaSeleccionados()
    {
        return listaSeleccionados;
    }

    /**
     * @param listaSeleccionados
     *            the listaSeleccionados to set
     */
    public void setListaSeleccionados(ArrayList<String> listaSeleccionados)
    {
        this.listaSeleccionados = listaSeleccionados;
    }

    /**
     * @return the listaTotalizados
     */
    public List<Producto> getListaTotalizados()
    {
        return listaTotalizados;
    }

    /**
     * @param listaTotalizados
     *            the listaTotalizados to set
     */
    public void setListaTotalizados(List<Producto> listaTotalizados)
    {
        this.listaTotalizados = listaTotalizados;
    }

    /**
     * @return the indicadorPedido
     */
    public boolean isIndicadorPedido()
    {
        return indicadorPedido;
    }

    /**
     * @param indicadorPedido
     *            the indicadorPedido to set
     */
    public void setIndicadorPedido(boolean indicadorPedido)
    {
        this.indicadorPedido = indicadorPedido;
    }

    /**
     * @return the codigoSeleccionado
     */
    public String getCodigoSeleccionado()
    {
        return codigoSeleccionado;
    }

    /**
     * @param codigoSeleccionado
     *            the codigoSeleccionado to set
     */
    public void setCodigoSeleccionado(String codigoSeleccionado)
    {
        this.codigoSeleccionado = codigoSeleccionado;
    }
}